/**
 * Classe Utilisateur
 * @author BRUNIAS Michael & HAMMAMI Christophe & LEOUTRE Thibaut
 */
import java.io.Serializable;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Set;

public class Utilisateur implements Serializable{
	
	/**
	 * pseudo correspond au nom du joueur dans la simulation boursiere
	 */
	private String pseudo;
	/**
	 * niveauDifficulte correspond au niveau du joueur dans la simulation boursiere
	 */
	private int niveauDifficulte;
	/**
	 * solde correspond au solde du joueur dans la simulation boursiere
	 */
	private double solde;
	/**
	 * soldeDepart correspond au solde de depart lors du d�but d'une partie
	 */
	private final static double soldeDepart = 10000;
	/**
	 * historique correspond aux quantit�s des actions poss�d�es par le joueur
	 */
	private HashMap <Actions,String> historique;
	
	
	/**
	 * Constructeur de la classe utilisateur qui initialise le pseudo, le niveau et le solde du joueur
	 * @param p : pseudo voulu du joueur
	 * @param n : niveau choisi par la joueur
	 */
	public Utilisateur(String p, int n){
		pseudo = p;
		niveauDifficulte = n;
		solde = soldeDepart;
		historique = new HashMap();
	}
	
	public String retournePseudo(){
		return pseudo;
	}
	
	/**
	 * Methode achat permettant d'acheter une certaine quantite d'une action
	 * @param a
	 * @param q quantite desirer pour l'achat
	 * @return solde solde final du joueur apr�s l'achat
	 */
	public double achat(Actions a, int q){
		double prix;
		prix = a.retourneValeur()*q;
		solde = solde - prix;
		historique.put(a,String.valueOf(q));
		return solde;
	}
	
	/**
	 * Methode vente permettant de vendre une certaine quantite d'une action
	 * @param a
	 * @param q quantite desirer pour l'achat
	 * @return solde solde final du joueur apres la vente
	 */
	public double vente(Actions a, int q){
		double prix;
		prix = a.retourneValeur()*q;
		solde = solde + prix;
		historique.remove(a);
		return solde;
	}
	
	/**
	 * Methode modificationDifficultes permet de changer la difficulte du jeu 
	 * en enlevant ou rajoutant les aides correspond au niveau voulu par la joueur
	 * @param n int : correspond au nouveau niveau choisi par le joueur
	 * @return niveauDifficulte
	 */
	public int modificationDifficultes(int n){
		return (niveauDifficulte = n);
	}
	
	/**
	 * Methode retourneSolde permet de retourne le solde du joueur 
	 * @return solde
	 */
	public double retourneSolde(){
		return solde;
	}
	
	public String retourneNombreAction(Actions a){
		String nombre = "";
		if (historique.containsKey(a)){
			nombre += historique.get(a);
		}
		return nombre;
	}
	
	public LinkedList retourneNomAction(){
		LinkedList <Actions> nomAction = new LinkedList <Actions>();
		Set<Actions> clef = historique.keySet();
		for (Actions as : clef){
			nomAction.add(as);
		}
		return nomAction;
	}
}